﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using CoreInmobiliario.Data;

namespace CoreInmobiliario.Business
{
    [DataObject]
    public class Propiedad
    {
        public static Propiedad GetInstance()
        {
            return new Propiedad();
        }

        private static DBDataContext GetDBDataContext()
        {
            Factories.DBDataContextFactory factory = new Factories.DBDataContextFactory();
            return factory.CreateDataContext() as DBDataContext;
        }

        public Data.Propiedad GetById(int propiedadId)
        {
            Data.Propiedad propiedad = null;

            try
            {
                propiedad = GetDBDataContext().Propiedads.FirstOrDefault(p => p.PropiedadId.Equals(propiedadId));
            }
            catch (Exception ex)
            {

            }

            return propiedad;
        }

        public List<Data.Propiedad> GetList()
        {
            List<Data.Propiedad> list = null;

            using (DBDataContext dataContext = GetDBDataContext())
            {
                try
                {
                    list = dataContext.Propiedads.ToList();

                }
                catch (Exception ex)
                {

                }
            }
            return list;
        }

        public List<Data.spPropiedades_selResult> GetPropiedades(string calle, int? tipoPropiedadId, int? provinciaId, int? localidadId, int? dormitorios)
        {
            List<Data.spPropiedades_selResult> list = null;

            using (DBDataContext dataContext = GetDBDataContext())
            {
                try
                {
                    list = dataContext.spPropiedades_sel(calle, tipoPropiedadId, dormitorios, provinciaId, localidadId).ToList();
                }
                catch (Exception ex)
                {

                }
            }
            return list;
        }

        public int GetLastPropiedadId()
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    var query = (from p in dc.GetTable<Data.Propiedad>()
                                 select (p.PropiedadId)).Max();

                    return Int32.Parse(query.ToString());
                }
                catch (Exception ex)
                {
                    return 0;
                }
            }
        }

        public Boolean InsertPropiedad(Data.Propiedad propiedad)
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    dc.Propiedads.InsertOnSubmit(propiedad);
                    dc.SubmitChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        public Boolean InsertPropiedadCaracteristica(Data.PropiedadCaracteristica propiedadCaracteristica)
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    dc.PropiedadCaracteristicas.InsertOnSubmit(propiedadCaracteristica);
                    dc.SubmitChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        public Boolean InsertPropiedadServicios(Data.PropiedadServicio propiedadServicios)
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    dc.PropiedadServicios.InsertOnSubmit(propiedadServicios);
                    dc.SubmitChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        public Boolean DeletePropiedadServicios(Data.PropiedadServicio propiedadServicios)
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    dc.spPropiedadServicio_del(propiedadServicios.PropiedadId, propiedadServicios.ServicioId);
                    dc.SubmitChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        public Boolean DeletePropiedadCaracteristica(Data.PropiedadCaracteristica propiedadCaracteristica)
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    dc.spPropiedadCaracteristica_del(propiedadCaracteristica.PropiedadId, propiedadCaracteristica.CaracteristicaId);
                    dc.SubmitChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        public Boolean DeletePropiedad(int propiedadId)
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    dc.spPropiedadServicioByPropiedadId_del(propiedadId);
                    dc.spPropiedadCaracteristicaByPropiedadId_del(propiedadId);
                    dc.spPropiedad_del(propiedadId);
                    dc.SubmitChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        }

        public Boolean UpdatePropiedad(Data.Propiedad p)
        {
            using (DBDataContext dc = GetDBDataContext())
            {
                try
                {
                    Data.Propiedad prop = dc.Propiedads.FirstOrDefault(pr => pr.PropiedadId.Equals(p.PropiedadId));
                    prop.Calle = p.Calle;
                    prop.Piso = p.Piso;
                    prop.Numero = p.Numero;
                    prop.Depto = p.Depto;   
                    prop.Superficie = p.Superficie;
                    prop.MetrosCubiertos = p.MetrosCubiertos;
                    prop.DisposicionId = p.DisposicionId;
                    prop.Dormitorios = p.Dormitorios;
                    prop.Ambientes = p.Ambientes;
                    prop.Banio = p.Banio;
                    prop.Antiguedad = p.Antiguedad;
                    prop.LocalidadId = p.LocalidadId;
                    prop.TipoPropiedadId = p.TipoPropiedadId;
                    prop.Estado = p.Estado;
                    prop.Descripcion = p.Descripcion;
                    prop.Interseccion = p.Interseccion;

                    dc.SubmitChanges();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }

        public List<Data.PropiedadServicio> GetServiciosByPropiedadId(int propiedadId)
        {
            List<Data.PropiedadServicio> list = null;

            using (DBDataContext dataContext = GetDBDataContext())
            {
                try
                {
                    list = dataContext.PropiedadServicios.Where(ps => ps.PropiedadId.Equals(propiedadId)).ToList();
                }
                catch (Exception ex)
                {

                }
            }
            return list;
        }

        public List<Data.PropiedadCaracteristica> GetCaracteristicasByPropiedadId(int propiedadId)
        {
            List<Data.PropiedadCaracteristica> list = null;

            using (DBDataContext dataContext = GetDBDataContext())
            {
                try
                {
                    list = dataContext.PropiedadCaracteristicas.Where(pc => pc.PropiedadId.Equals(propiedadId)).ToList();
                }
                catch (Exception ex)
                {

                }
            }
            return list;
        }

        public Data.PropiedadServicio GetByPropiedadIdServicioId(int propiedadId, int servicioId)
        {
            Data.PropiedadServicio propiedadServicio = null;

            try
            {
                propiedadServicio = GetDBDataContext().PropiedadServicios.FirstOrDefault(p => p.PropiedadId.Equals(propiedadId) && p.ServicioId.Equals(servicioId));
            }
            catch (Exception ex)
            {

            }

            return propiedadServicio;
        }

        public Data.PropiedadCaracteristica GetByPropiedadIdCaracteristicaId(int propiedadId, int caracteristicaId)
        {
            Data.PropiedadCaracteristica propiedadCaracteristica = null;

            try
            {
                propiedadCaracteristica = GetDBDataContext().PropiedadCaracteristicas.FirstOrDefault(p => p.PropiedadId.Equals(propiedadId) && p.CaracteristicaId.Equals(caracteristicaId));
            }
            catch (Exception ex)
            {

            }

            return propiedadCaracteristica;
        }
    }
}
